/*
    做法：
    开始时，如果a胜b则由a到b连一条边
    这样所有a能走到的点都是排名在a以后的，所有能走到a的点都是排名在a以前的
    此时用floyd，求出每个点能到达的点
    如果有一个点，排名在它之前的和排名在它之后的点之和为n-1，那么它的排名就是确定的

    问题：在计算传递闭包时，依次ijk的循环必须为j->i且i->k推出j->k，而由i->j且j->k推出i->k通过不了

    优化：计算传递闭包时，三层嵌套通过判断语句转化成两层嵌套加判断
*/
#include<iostream>
#include<cstring>

using namespace std;

#define maxn 106

int n,m;
bool beat[maxn][maxn];

int main(void){
    cin>>n>>m;
    memset(beat,false,sizeof(beat));
    for(int i=0;i<m;i++){   //m轮比赛
        int a,b;
        cin>>a>>b;
        beat[a][b]=true;    //a击败了b
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(beat[j][i]){
                for(int k=1;k<=n;k++){
                    if(beat[i][k]){
                        beat[j][k]=true;    //传递闭包
                    }
                }
            }
        }
    }
    int res=0;  //记录数字
    for(int i=1;i<=n;i++){
        int tmp=0;
        for(int j=1;j<=n;j++){
            tmp+=beat[i][j]+beat[j][i]; //虽然不可能出现互相打败，但是因为闭包，打败被打败的情况都有可能发生
        }
        if(tmp==n-1){
            res++;
        }
    }
    cout<<res<<endl;
    return 0;
}